\section{Détails d'implémentation}
\subsection{Windows}
Le projet a été commencé sur les ordinateurs du CREMI, mais en raison de problèmes
matériels nous empêchant de travailler chez nous sous Linux, il a été choisi de porter
le logiciel sous Windows, afin de permettre la compilation avec Visual Studio.

Un soin tout particulier a été apporté au fait de garder la compatibilité Linux.

\subsubsection{C++}
Visual Studio ne gérant pas la norme C99, il a été nécessaire, en raison de
l'emploi dans le code original de nombreuses fonctions mathématiques uniquement présentes
en C99, de porter le logiciel en C++.

\subsection{Utilisation de macros}
Plusieurs macros ont été écrites pour faciliter la lecture et l'écriture du code.
C'est le cas par exemple pour l'opération dite de \textit{clamping atomique} :
cette macro assigne à speed[x], la valeur $min(max(y, SPEED\_MAX), SPEED\_MIN)$ de manière atomique.

\begin{figure}[H]
\begin{lstlisting}
#define SPEED_ASSIGN(x, y) \
	atomic_xchg(&speed[x], clamp(y, SPEED_MIN, SPEED_MAX));
\end{lstlisting}
\caption{Clamping atomique}
\end{figure}


De même, voici l'opération qui consiste à copier un vecteur au format VBO, c'est-à-dire
que toutes les composantes sont réparties en tableau, dans un vecteur OpenCL au format float3.

\begin{lstlisting}
#define COPY_VECTOR(dest, vect, i) \
{ \
dest.x = vect[i]; \
dest.y = vect[i + ROUND(N)]; \
dest.z = vect[i + 2*ROUND(N)]; \
}
\end{lstlisting}

Comme $ROUND(ROUND(N)) = ROUND(N)$, il n'est pas nécessaire de faire attention à la valeur de N lors de l'appel,
il faut juste qu'il soit défini dans la fonction ou la macro est appelée.

\subsection{Limitation de la vitesse}
Pour éviter une explosion de la vitesse comme c'est le cas avec l'implémentation naïve de la gravité par exemple,
plusieurs mesures ont été prises pour la restreindre.

\subsubsection{Cas de la gravité}
Ici, il a été choisi d'appliquer une force deux fois plus importante aux atomes s'éloignant du centre de gravité (en pratique, le plan $(Oy, Oz)$).
Cela les fait rebondir de moins en moins haut.

\subsubsection{Cas général}
La vitesse a été limitée dans toutes les opérations, à l'aide de la macro vue précédemment.
Empiriquement, il a été déterminé qu'une valeur de $0.2$ permettait d'observer les mouvements à l'écran
sans que cela soit désagréable à regarder ou dangereux pour les personnes sujettes à l'épilepsie.

\subsection{Optimisations sur les calculs}
Autant que possible, nous avons essayé de limiter le nombre de calculs redondants,
ou bien d'optimiser le nombre de variables.
Par exemple, par rapport aux formules proposées dans le sujet, la fonction \texttt{collide\_compute} chargée
de gérer les collisions entre atomes utilise beaucoup moins
de variables et factorise de nombreux calculs, en notant que $i = M_1$ avec $M_{1}$ la
première ligne de la matrice.

De même, les vecteurs $V_{a, r}'$ et $V_{b, r}'$ peuvent se construire directement,
sans passer par des vecteurs $V_{a, r}$ et $V_{b, r}$ au préalable.
